home *** CD-ROM | disk | FTP | other *** search
- %
- % "Translations" of Prolog benchmarks first used on Turbo Prolog.
- %
- % When running these benchmarks, remember that the read/1 predicate expects
- % to see a period to signal the end of input!
- %
- % Note: All errors from the original set of benchmarks have been fixed.
- %
- % a.lane (4/17/87)
- %
- %---------------------------------------------------------------------
-
- % Factorial Benchmark Test
-
- fact :-
- write('Enter number of iterations '),
- read(Iter),nl,
- write('Enter factorial number '),
- read(Num),nl,nl,
- time(Start),
- repeat(Iter,Num),
- time(Finish),nl, Overall is Finish - Start,
- write('Time is '),write(Overall),nl.
-
- factorial(1,1) :- !.
- factorial(N,Result) :-
- N1 is N - 1,
- factorial(N1, Temporary),
- Result is N * Temporary.
-
- repeat(0,R) :- write(X),nl.
- repeat(N,R) :- factorial(R,_),
- N1 is N - 1,
- repeat(N1,R).
-
- time(Time) :- Time is cputime.
-
- %---------------------------------------------------------------------
-
- % List Reversal Test Program
-
- lrev :-
- write('Enter cycle length '),
- read(N),
- time(Start),
- cycle(N),
- time(Finish), Overall is Finish - Start,
- write('Time = '),write(Overall),nl.
-
- append( [], L, L ).
- append( [Z|L1], L2, [Z|L3] ) :- append( L1, L2, L3 ).
-
-
- lips(L) :- rev( [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
- 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,
- 43,44,45,46,47,48,49,50], L ).
-
- lipshort(L) :- rev( [1,2,3,4,5,6,7,8,9,10], L ).
-
-
- rev( [], [] ).
- rev( [H|T], L ) :- rev( T,Z), append( Z, [H], L ).
-
- cycle(0).
- cycle(N) :- N1 is N - 1, lips(_), cycle(N1).
-
- time(Time) :- Time is cputime.
-
- %---------------------------------------------------------------------
-
- % Floating Point Test Program
-
- % This floating-point benchmark is significantly different from the one
- % performed on the Turbo Prolog.
- %
- % The heart of the Turbo benchmark reads:
- %
- % calc(A,B) :-
- % C is 1.0,
- % C1 is C * A,
- % C2 is C1 * B,
- % C3 is C2 / A,
- % C is C3 / B,
- % bound(C).
- %
- % which is flawed for two reasons. First, the value of C is reinitialized each
- % time the predicate calc/2 is called, which defeats one of the reasons for
- % performing these operations 5000 times: To see if there is any cumulative
- % error. Second, the Turbo benchmark works only if the result of C3 / B
- % is *exactly* 1.0. If there is any error (i.e., if, as is true with ALS
- % Prolog, C3 / B is 1.00000000000000000001) the thing won't fly at all.
-
- float :-
- time(Start),
- cycle(5000, 1.0, 2.71828, 3.14159 ),
- time(Finish), Overall is Finish - Start,
- write('Time is '),write(Overall),nl.
-
- calc(In,Out,A,B) :-
- C1 is In * A,
- C2 is C1 * B,
- C3 is C2 / A,
- Out is C3 / B.
-
- cycle(0,C,A,B) :-
- write('C is ',C),nl.
-
-
- cycle(N,C,A,B) :-
- calc(C,CF,A,B),
- N1 is N - 1,
- cycle(N1,CF,A,B).
-
- time(Time) :- Time is cputime.
-
- %---------------------------------------------------------------------
-
- % Math Functions Test Program
-
- goal :-
- write('Doing square root...'),nl,
- time(T1),
- cyclesqrt(1000,_,T1),
- write('Doing logs..'),nl,
- time(T2),
- cycleln(1000,_,T2),
- write('Doing exp..'),nl,
- time(T3),
- cycleexp(1000,_,T3),
- write('Doing atan..'),nl,
- time(T4),
- cycleatan(1000,_,T4),
- write('Doing sin...'),nl,
- time(T5),
- cyclesin(1000,_,T5).
-
- cyclesqrt(0,R,T1) :- time(T6), Stime is T6 - T1,
- write('SQRT : '),write(Stime),nl,!.
-
- cyclesqrt(N, R, T) :-
- N > 0, N1 is N - 1, R is sqrt(100.0), cyclesqrt(N1,R,T).
-
- cycleln(0,R,T2) :- time(T7), Ltime is T7 - T2,
- write('LN : '),write(Ltime),nl.
-
- cycleln(N, R,T) :-
- N > 0, N1 is N - 1, R is log(100.0), cycleln(N1,R,T).
-
- cycleexp(0,R,T3) :- time(T8), Etime is T8 - T3,
- write('EXP : '),write(Etime),nl.
-
- cycleexp(N, R,T) :-
- N > 0, N1 is N - 1, R is exp(10.0), cycleexp(N1,R,T).
-
- cycleatan(0,R,T4) :- time(T9), Atime is T9 - T4,
- write('ATAN : '),write(Atime),nl.
-
- cycleatan(N, R,T) :-
- N > 0, N1 is N - 1, R is atan(10.0), cycleatan(N1,R,T).
-
- cyclesin(0,R,T5) :- time(T10), Stime is T10 - T5,
- write('SIN : '),write(Stime),nl.
-
- cyclesin(N, R,T) :-
- N > 0, N1 is N - 1, R is sin(10.0), cyclesin(N1,R,T).
-
- time(Time) :- Time is cputime.
-
- %---------------------------------------------------------------------
-
- % Disk Read Program
-
- dread :-
- see('a:tempo.dat'),
- time(Start),
- get_text(512),
- time(Finish), Overall is Finish - Start,
- seen, see(user),
- write('Time = '),write(Overall),nl,
- write('DONE'),nl.
-
- get_text(0).
- get_text(N) :-
- read(Str),
- N1 is N - 1,
- get_text(N1).
-
- %---------------------------------------------------------------------
-
- % Disk write benchmark
-
- dwrite :-
- tell('a:tempo.dat'),
- time(Start),
- send_text(512),
- time(Finish), Overall is Finish - Start,
- told, tell(user),
- write('Time = '),write(Overall),nl,
- write('DONE'),nl.
-
- send_text(0).
- send_text(N) :-
- write('x2345678123456781234567812345670123456781234567812345678123456701234
- 56781234567812345678123456701234567812345678123456781234567.'),
- nl, N1 is N - 1,
- send_text(N1).
-
- time(Time) :- Time is cputime.
-
- %---------------------------------------------------------------------
-
- % Tower of Hanoi Test Program
-
- hanoi :-
- write('Enter tower height '),
- read(High),
- time(Start),
- hanoi(High),
- time(Finish), Overall is Finish - Start,
- write('Time : '),write(Overall),nl.
-
-
- hanoi(N) :- move(N, left, center, right).
-
- move(0, _, _, _) :- !.
- move(N, A, B, C) :-
- M is N - 1,
- move(M, A, C, B),
- move2(bottom, A, B),
- move(M, C, B, A).
- move2(bottom, A, B) :-
- write('Move the disk on '),
- write(A),
- write(' to '),
- write(B),
- nl.
-
- time(Time) :- Time is cputime.
-
- %---------------------------------------------------------------------
-
- % Sieve test program
-
- erasthones :-
- time(Start),
- cycle(10),
- time(Finish), Overall is Finish - Start,
- write('Time is '),write(Overall),nl.
-
- primes( Limit, Ps ) :-
- integers( 2, Limit, Is ),
- sift( Is, Ps ).
-
- integers( Low, High, [Low|Rest] ) :-
- Low =< High, !, M is Low + 1,
- integers(M, High, Rest ).
- integers( _,_,[] ).
-
- sift( [], [] ).
- sift( [I|Is], [I|Ps]) :-
- remove(I,Is,New),
- sift( New, Ps ).
-
- remove(_,[],[]).
- remove(P,[I|Is],[I|Nis]) :-
- I mod P =\= 0,!,
- remove(P, Is, Nis).
- remove(P,[I|Is],Nis) :-
- I mod P =:= 0,
- remove(P, Is, Nis).
-
- cycle(0).
- cycle(N) :-
- N1 is N - 1,
- primes(100,_),
- cycle(N1).
-
- time(Time) :- Time is cputime.
-
- %---------------------------------------------------------------------
-
- % This program is called with the query "?-boresea(X)."
- % X is the number of loop iterations executed. It should be big
- % enough to give significant results.
- % suggested value for X: 100 for interpreted code
- % 1000 for compiled code
- % average values for C-prolog interpreter:
- % X=1000, Tloop=27.1 T.comp=1.0 Tnet=26.1 Klips=7.7
-
- boresea(X)
- :- T1 is cputime,
- do_max_KLips(X), % calls the loop to execute the
- T2 is cputime, % sequence of 200 predicates
- compens_loop(X), % compensation loop
- T3 is cputime,
- print_times(T1,T2,T3,X,200). % compute and print results
-
-
- compens_loop(0). % compensation loop
- compens_loop(X) :- Y is X - 1, compens_loop(Y).
-
- print_times(T1,T2,T3,X,I) :- % prints the results
- TT1 is T2 - T1,
- TT2 is T3 - T2,
- TT is TT1 - TT2,
- write('T overall loop: '),write(TT1), nl,
- write('T compens loop: '),write(TT2), nl,
- write('T net: '),write(TT),nl,
- write('KLips: '),
- Li is I * X,
- Lips is Li / TT,
- KLips is Lips / 1000,
- write(KLips),nl,nl.
-
- do_max_KLips(0). % loop calling the actual benchmark
- do_max_KLips(X) :- lips1, Y is X - 1, do_max_KLips(Y).
-
- % predicates to test call
-
- lips1 :- lips2.
- lips2 :- lips3.
- lips3 :- lips4.
- lips4 :- lips5.
- lips5 :- lips6.
- lips6 :- lips7.
- lips7 :- lips8.
- lips8 :- lips9.
- lips9 :- lips10.
- lips10 :- lips11.
- lips11 :- lips12.
- lips12 :- lips13.
- lips13 :- lips14.
- lips14 :- lips15.
- lips15 :- lips16.
- lips16 :- lips17.
- lips17 :- lips18.
- lips18 :- lips19.
- lips19 :- lips20.
- lips20 :- lips21.
- lips21 :- lips22.
- lips22 :- lips23.
- lips23 :- lips24.
- lips24 :- lips25.
- lips25 :- lips26.
- lips26 :- lips27.
- lips27 :- lips28.
- lips28 :- lips29.
- lips29 :- lips30.
- lips30 :- lips31.
- lips31 :- lips32.
- lips32 :- lips33.
- lips33 :- lips34.
- lips34 :- lips35.
- lips35 :- lips36.
- lips36 :- lips37.
- lips37 :- lips38.
- lips38 :- lips39.
- lips39 :- lips40.
- lips40 :- lips41.
- lips41 :- lips42.
- lips42 :- lips43.
- lips43 :- lips44.
- lips44 :- lips45.
- lips45 :- lips46.
- lips46 :- lips47.
- lips47 :- lips48.
- lips48 :- lips49.
- lips49 :- lips50.
- lips50 :- lips51.
- lips51 :- lips52.
- lips52 :- lips53.
- lips53 :- lips54.
- lips54 :- lips55.
- lips55 :- lips56.
- lips56 :- lips57.
- lips57 :- lips58.
- lips58 :- lips59.
- lips59 :- lips60.
- lips60 :- lips61.
- lips61 :- lips62.
- lips62 :- lips63.
- lips63 :- lips64.
- lips64 :- lips65.
- lips65 :- lips66.
- lips66 :- lips67.
- lips67 :- lips68.
- lips68 :- lips69.
- lips69 :- lips70.
- lips70 :- lips71.
- lips71 :- lips72.
- lips72 :- lips73.
- lips73 :- lips74.
- lips74 :- lips75.
- lips75 :- lips76.
- lips76 :- lips77.
- lips77 :- lips78.
- lips78 :- lips79.
- lips79 :- lips80.
- lips80 :- lips81.
- lips81 :- lips82.
- lips82 :- lips83.
- lips83 :- lips84.
- lips84 :- lips85.
- lips85 :- lips86.
- lips86 :- lips87.
- lips87 :- lips88.
- lips88 :- lips89.
- lips89 :- lips90.
- lips90 :- lips91.
- lips91 :- lips92.
- lips92 :- lips93.
- lips93 :- lips94.
- lips94 :- lips95.
- lips95 :- lips96.
- lips96 :- lips97.
- lips97 :- lips98.
- lips98 :- lips99.
- lips99 :- lips100.
- lips100:- lips101.
- lips101 :- lips102.
- lips102 :- lips103.
- lips103 :- lips104.
- lips104 :- lips105.
- lips105 :- lips106.
- lips106 :- lips107.
- lips107 :- lips108.
- lips108 :- lips109.
- lips109 :- lips110.
- lips110 :- lips111.
- lips111 :- lips112.
- lips112 :- lips113.
- lips113 :- lips114.
- lips114 :- lips115.
- lips115 :- lips116.
- lips116 :- lips117.
- lips117 :- lips118.
- lips118 :- lips119.
- lips119 :- lips120.
- lips120 :- lips121.
- lips121 :- lips122.
- lips122 :- lips123.
- lips123 :- lips124.
- lips124 :- lips125.
- lips125 :- lips126.
- lips126 :- lips127.
- lips127 :- lips128.
- lips128 :- lips129.
- lips129 :- lips130.
- lips130 :- lips131.
- lips131 :- lips132.
- lips132 :- lips133.
- lips133 :- lips134.
- lips134 :- lips135.
- lips135 :- lips136.
- lips136 :- lips137.
- lips137 :- lips138.
- lips138 :- lips139.
- lips139 :- lips140.
- lips140 :- lips141.
- lips141 :- lips142.
- lips142 :- lips143.
- lips143 :- lips144.
- lips144 :- lips145.
- lips145 :- lips146.
- lips146 :- lips147.
- lips147 :- lips148.
- lips148 :- lips149.
- lips149 :- lips150.
- lips150 :- lips151.
- lips151 :- lips152.
- lips152 :- lips153.
- lips153 :- lips154.
- lips154 :- lips155.
- lips155 :- lips156.
- lips156 :- lips157.
- lips157 :- lips158.
- lips158 :- lips159.
- lips159 :- lips160.
- lips160 :- lips161.
- lips161 :- lips162.
- lips162 :- lips163.
- lips163 :- lips164.
- lips164 :- lips165.
- lips165 :- lips166.
- lips166 :- lips167.
- lips167 :- lips168.
- lips168 :- lips169.
- lips169 :- lips170.
- lips170 :- lips171.
- lips171 :- lips172.
- lips172 :- lips173.
- lips173 :- lips174.
- lips174 :- lips175.
- lips175 :- lips176.
- lips176 :- lips177.
- lips177 :- lips178.
- lips178 :- lips179.
- lips179 :- lips180.
- lips180 :- lips181.
- lips181 :- lips182.
- lips182 :- lips183.
- lips183 :- lips184.
- lips184 :- lips185.
- lips185 :- lips186.
- lips186 :- lips187.
- lips187 :- lips188.
- lips188 :- lips189.
- lips189 :- lips190.
- lips190 :- lips191.
- lips191 :- lips192.
- lips192 :- lips193.
- lips193 :- lips194.
- lips194 :- lips195.
- lips195 :- lips196.
- lips196 :- lips197.
- lips197 :- lips198.
- lips198 :- lips199.
- lips199 :- lips200.
- lips200.
-
- %---------------------------------------------------------------------
- % choice point benchmark.
-
- % The predicates are called:
- % o "choice_point(N)" - creation of choice points
- % N is the number of loop iterations executed
-
- % predicate to test creation of choice points without
- % backtracking
-
- choice_point(N) :- T1 is cputime,
- cre_CP(N), T2 is cputime,
- compens_loop(N), T3 is cputime,
- print_times(T1,T2,T3,N,20).
-
- % compensation loop, used to measure the time spent in
- % the loop
-
- compens_loop(0).
- compens_loop(X) :- Y is X - 1, compens_loop(Y).
-
- % loop to test choice point creation
-
- cre_CP(0).
- cre_CP(N):-M is N-1, ccp1(0,0,0), cre_CP(M).
-
- cre_CP0ar(0).
- cre_CP0ar(N):-M is N-1, ccp1, cre_CP0ar(M).
-
-
-
- print_times(T1,T2,T3,X,I) :- % prints the results
- TT1 is T2 - T1,
- TT2 is T3 - T2,
- TT is TT1 - TT2,
- write('T overall loop: '),write(TT1), nl,
- write('T compens loop: '),write(TT2), nl,
- write('T net: '),write(TT),nl,
- write('KLips: '),
- Li is I * X,
- Lips is Li / TT,
- KLips is Lips / 1000,
- write(KLips),nl,nl.
-
- % ccp1 creates 20 choice points
- % ccp1 is the beginning of a set of predicates
- % composed of 2 clauses each. Every invokation of nd0 will create
- % a sequence of 20 choice points. The body of the clauses are
- % limited to one goal, thus avoiding a creation of environment
- % when the clause is activated. nd0, and its successors, have
- % three arguments to comply with our average static analysis
- % results made on more than 30 real Prolog programs.
- % ccpXX exists with 3 arguments, and 0 args.
-
- ccp1(X,Y,Z):-ccp2(X,Y,Z).
- ccp1(X,Y,Z).
- ccp2(X,Y,Z):-ccp3(X,Y,Z).
- ccp2(X,Y,Z).
- ccp3(X,Y,Z):-ccp4(X,Y,Z).
- ccp3(X,Y,Z).
- ccp4(X,Y,Z):-ccp5(X,Y,Z).
- ccp4(X,Y,Z).
- ccp5(X,Y,Z):-ccp6(X,Y,Z).
- ccp5(X,Y,Z).
- ccp6(X,Y,Z):-ccp7(X,Y,Z).
- ccp6(X,Y,Z).
- ccp7(X,Y,Z):-ccp8(X,Y,Z).
- ccp7(X,Y,Z).
- ccp8(X,Y,Z):-ccp9(X,Y,Z).
- ccp8(X,Y,Z).
- ccp9(X,Y,Z):-ccp10(X,Y,Z).
- ccp9(X,Y,Z).
- ccp10(X,Y,Z):-ccp11(X,Y,Z).
- ccp10(X,Y,Z).
- ccp11(X,Y,Z):-ccp12(X,Y,Z).
- ccp11(X,Y,Z).
- ccp12(X,Y,Z):-ccp13(X,Y,Z).
- ccp12(X,Y,Z).
- ccp13(X,Y,Z):-ccp14(X,Y,Z).
- ccp13(X,Y,Z).
- ccp14(X,Y,Z):-ccp15(X,Y,Z).
- ccp14(X,Y,Z).
- ccp15(X,Y,Z):-ccp16(X,Y,Z).
- ccp15(X,Y,Z).
- ccp16(X,Y,Z):-ccp17(X,Y,Z).
- ccp16(X,Y,Z).
- ccp17(X,Y,Z):-ccp18(X,Y,Z).
- ccp17(X,Y,Z).
- ccp18(X,Y,Z):-ccp19(X,Y,Z).
- ccp18(X,Y,Z).
- ccp19(X,Y,Z):-ccp20(X,Y,Z).
- ccp19(X,Y,Z).
- ccp20(X,Y,Z).
- ccp20(X,Y,Z).
-